TSM Adaptive Intraday Breakout (S) - разбор
Что это за стратегия
TSM Adaptive Intraday Breakout (S) - короткая внутридневная стратегия Кауфмана на основе двух нормализованных диапазонов. Она сравнивает текущий вынос цены вверх и вниз относительно цены period баров назад, нормализует эти выносы через period^apower и AverageTrueRange(period), а затем проверяет экстремумы этих нормализованных рядов за то же окно period.
Идея исходника:
если рынок показывает достаточно сильный положительный вынос вверх и одновременно отрицательный вынос вниз остается "внутри" порогов, стратегия покупает на закрытии бара;
если положительный вынос вверх остается слабым, а отрицательный вынос вниз становится достаточно большим по модулю, стратегия открывает шорт на закрытии бара.
Несмотря на суффикс (S), сам исходник содержит и buy, и sell short. Это значит, что стратегию нельзя считать чисто short-only без дополнительной проверки поведения платформы.
Исходный код
[LegacyColorValue = true]; { TSM Adaptive Intraday Breakout From Dennis Meyers, "Range Roving" (Active Trade, March 2003) Copyright 2011, P J Kaufman, All rights reserved. } Inputs: period(10), apower(0.75), highthreshold(.50), lowthreshold(1.05); vars: highrange(0), lowrange(0), nhr(0), nlr(0), hrmax(0), lrmax(0); { high and low ranges } highrange = high - low[period]; lowrange = low - high[period]; { lowrange = low - low[period]; } { normalized ranges } nhr = highrange/power(period,apower)/avgtruerange(period); nlr = lowrange/power(period,apower)/avgtruerange(period); hrmax = highest(nhr,period); lrmax = lowest(nlr,period); { trading signals } { buy when inside the threshold values } if hrmax > highthreshold and lrmax < lowthreshold then buy 1 contract this bar on close { sell when outside the threshold values } else if hrmax < highthreshold and lrmax > lowthreshold then sell short 1 contract this bar on close;
Разбор по шагам
1. Базовые диапазоны
highrange = High - Low[period] lowrange = Low - High[period]
highrange измеряет, насколько текущий максимум поднялся над минимумом period баров назад.
lowrange измеряет, насколько текущий минимум находится ниже максимума period баров назад.
Торговый смысл:
highrangeфиксирует накопленный вынос вверх;lowrangeфиксирует накопленный вынос вниз.
В исходнике закомментирован альтернативный вариант:
lowrange = low - low[period]
Но активной формулой является именно low - high[period].
2. Нормализация диапазонов
nhr = highrange / power(period, apower) / AvgTrueRange(period) nlr = lowrange / power(period, apower) / AvgTrueRange(period)
Здесь оба диапазона делятся:
на степенную функцию периода
period^apower;на
AverageTrueRange(period).
Торговый смысл:
стратегия старается сравнивать выносы не в "сырых" пунктах, а в масштабе текущей волатильности;
деление на
period^apowerдополнительно ослабляет зависимость порогов от длины окна.
3. Экстремумы нормализованных рядов
hrmax = Highest(nhr, period) lrmax = Lowest(nlr, period)
За последние period баров берутся:
максимум нормализованного верхнего диапазона
nhr;минимум нормализованного нижнего диапазона
nlr.
Важно:
lrmaxв исходнике назван какmax, но считается черезLowest, то есть это самый отрицательный или самый малый уровень рядаnlr.
4. Условие входа в лонг
hrmax > highthreshold and lrmax < lowthreshold
При выполнении этих условий система делает:
buy 1 contract this bar on close
Что понятно уверенно:
вход происходит на закрытии текущего бара;
размер позиции в исходнике фиксированный:
1 contract;лонг появляется, когда верхний вынос достаточно силен относительно порога
highthreshold.
Что не до конца очевидно:
комментарий
buy when inside the threshold valuesне полностью совпадает с формулой, потому что первая часть требуетhrmax > highthreshold, то есть явный выход выше порога.
5. Условие входа в шорт
hrmax < highthreshold and lrmax > lowthreshold
При выполнении этих условий система делает:
sell short 1 contract this bar on close
Здесь возникает важная неоднозначность.
Если nlr = lowrange / ..., а lowrange = low - high[period], то nlr обычно будет отрицательным или малым числом. Тогда условие:
lrmax > 1.05
выглядит нетипично и на реальных данных может выполняться крайне редко или не выполняться вовсе.
Возможные объяснения:
в исходнике допущена опечатка, и для шорта ожидалось сравнение другого знака;
комментарий или один из порогов исторически менялись, а текст остался в промежуточной версии;
автор действительно использовал асимметричную шкалу и рассчитывал на редкие сигналы.
6. Логика выхода
В исходнике явных sell, buy to cover, stop, profit target или временных выходов нет.
Значит, возможны только такие трактовки:
позиция переворачивается противоположным входом;
позиция удерживается до обратного сигнала;
часть выходной логики находилась в настройках платформы, а не в тексте;
текст является фрагментом более полной системы.
Для TSLab это значит, что поведение выхода нужно сделать явным и задокументировать.
Что понятно уверенно
Используются только стандартные ценовые ряды и
AverageTrueRange(period).Нужны исторические ссылки
Low[period]иHigh[period].Нужны
HighestиLowestпо фиксированному окнуperiod.Входы происходят по рынку на закрытии текущего бара.
Авторский размер позиции фиксирован и равен
1.Явного авторского стоп-лосса в тексте нет.
Что остается не до конца очевидным
Суффикс
(S)не согласуется с наличием лонгового входа в исходнике.Комментарии
inside/outside threshold valuesне полностью совпадают с буквальным поведением условий.Условие
lrmax > lowthresholdдля шорта выглядит подозрительно с учетом того, чтоlrmax = Lowest(nlr, period).В исходнике нет явных правил закрытия позиции, кроме потенциального переворота противоположным сигналом.
Не указан исходный инструмент и таймфрейм.
Торговый смысл формул
High - Low[period]измеряет силу смещения вверх относительно исторической опоры.Low - High[period]измеряет силу смещения вниз относительно противоположной границы окна.Деление на
ATR(period)переводит выносы в волатильностную шкалу.Деление на
period^apowerсглаживает влияние длины окна и делает пороги более переносимыми между разнымиperiod.Highest(nhr, period)иLowest(nlr, period)ищут не одномоментный вынос, а экстремальный характер движения за все окно.
Итог
Стратегия может быть перенесена в TSLab без новых кастомных индикаторов:
стандартные блоки
High,Low,Close,ATR,Highest,Lowest;блоки
Формуладля исторических ссылок, степенной нормализации и булевых условий;торговые блоки рыночного входа и явных выходов.
Главная инженерная задача при переносе - не расчет индикаторов, а явная фиксация выходной логики и риск-модели, потому что в исходнике они заданы неполно.